package com.web.rabbitmq.crawler;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

import org.apache.log4j.Logger;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class Rabbit {

	private static final Logger logger = Logger.getLogger(Rabbit.class);

	/**
	 * 创建队列链接
	 * 
	 * @return
	 * @throws IOException
	 * @throws TimeoutException
	 */
	public static Connection getConnection() {
		try {
			// 创建连接工厂
			ConnectionFactory factory = new ConnectionFactory();
			// 设置RabbitMQ地址
			factory.setHost("192.168.1.182");
			factory.setUsername("admin");
			factory.setPassword("123456");
			// 创建一个新的连接
			Connection connection = factory.newConnection();
			logger.info("创建队列连接成功");
			return connection;
		} catch (Exception e) {
			logger.info("创建队列连接失败");
			return null;
		}
	}

	/**
	 * 创建队列频道
	 * 
	 * @param connection
	 * @param QUEUE_NAME
	 * @return
	 * @throws Exception
	 */
	public static Channel getChannel(Connection connection, String QUEUE_NAME) {

		try {
			// 创建一个频道
			Channel channel = connection.createChannel();
			// 声明一个队列 -- 在RabbitMQ中，队列声明是幂等性的（一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同），也就是说，如果不存在，就创建，如果存在，不会对已经存在的队列产生任何影响。
			channel.queueDeclare(QUEUE_NAME, true, false, false, null);
			logger.info(QUEUE_NAME+"***创建队列频道成功***");
			return channel;
		} catch (Exception e) {
			logger.info(QUEUE_NAME+"***创建队列频道失败***");
			return null;
		}

	}

	/**
	 * 关闭队列频道和连接
	 * 
	 * @param connection
	 * @param channel
	 */
	public static void close(Connection connection, Channel channel) {
		try {
			channel.close();
			logger.info("关闭队列频道成功");
		} catch (Exception e) {
			logger.info("关闭队列频道失败");
		}

		try {
			connection.close();
			logger.info("关闭队列连接成功");
		} catch (Exception e) {
			logger.info("关闭队列连接失败");
		}

	}

}
